package comment_api

import (
	"gin_study_blog/common"
	"gin_study_blog/common/http"
	"gin_study_blog/models"
	"gin_study_blog/service/redis"
	"gin_study_blog/utils"
	"github.com/gin-gonic/gin"
	"gorm.io/gorm"
)

type CommentRequest struct {
	ArticleID       string `json:"article_id" binding:"required" msg:"请选择文章"`
	Content         string `json:"content" binding:"required" msg:"请输入评论内容"`
	ParentCommentID *uint  `json:"parent_comment_id"` // 父级评论id
}

func (CommentApi) CommentCreateView(c *gin.Context) {
	var cr CommentRequest
	err := c.ShouldBindJSON(&cr)
	if err != nil {
		http.FailWithError(err, &cr, c)
		return
	}
	// 从中间件中获取用户信息
	_claims, _ := c.Get("user")
	claims := _claims.(*utils.UserClaims)
	// 文章是否存在
	_, err = utils.CommDetail(cr.ArticleID)
	if err != nil {
		common.Log.Error(err.Error())
		http.FailWithMessage("文章不存在", c)
		return
	}
	// 判断是否是子评论
	if cr.ParentCommentID != nil {
		// 子评论
		// 给父评论 +1
		// 父评论id
		var parentComment models.CommentModel
		// 父级评论是否存在
		err = common.DB.Take(&parentComment, cr.ParentCommentID).Error
		if err != nil {
			http.FailWithMessage("父评论不存在", c)
			return
		}
		// 判断父评论的文章是否和当前文章一直
		if parentComment.ArticleID != cr.ArticleID {
			http.FailWithMessage("评论文章不一致", c)
			return
		}
		// 给父级评论数+1
		common.DB.Model(&parentComment).Update("comment_count = ?", gorm.Expr("comment_count + 1"))
	}
	// 添加评论
	err = common.DB.Create(&models.CommentModel{
		ParentCommentID: cr.ParentCommentID,
		Content:         cr.Content,
		ArticleID:       cr.ArticleID,
		UserID:          claims.UserID,
	}).Error
	if err != nil {
		common.Log.Error(err.Error())
		http.FailWithMessage("添加评论失败", c)
		return
	}
	// 拿到文章数, 新的文章评论存缓存里, 给文章评论数 +1
	err = redis.NewCommentCount().Set(cr.ArticleID)
	http.IsOkWithMessage("评论成功", c)
}
